from win_codehelper import CodeHelper


class WinClient(CodeHelper):
    FileUI = 'ui/client.ui'
    Title = '客户端定义'
    Folder = 'client'
    TestFileTopLines = '''
from gevent import monkey
monkey.patch_all()

from gevent import spawn
import gevent

import time
from pprint import pprint
from time import sleep

from hyload.stats import Stats
from hyload.logger import TestLogger

from hyload.httpclient import HttpClient

clientName2Func = {}

# 如果 args 有值，一定是列表，元素依次赋值给每次clientfunc调用
def createClients(clientName, clientNum, interval, args=None):
    clientFunc = clientName2Func[clientName]
    for i in range(clientNum):
        if args:
            spawn(clientFunc, args[i])
        else:
            spawn(clientFunc)

        if i < clientNum - 1:
            sleep(interval)

# 如果 args 有值，一定是列表，元素依次赋值给每次clientfunc调用
def createClientsAndKeep(clientName, clientNum, interval, args=None):
    clientFunc = clientName2Func[clientName]

    def realFunc(args=None):
        while True:
            try:
                clientFunc(args)
            except Exception as e:
                print(e)

    for i in range(clientNum):
        if args:
            spawn(realFunc, args[i])
        else:
            spawn(realFunc)

        if i < clientNum - 1:
            sleep(interval)

Stats.start()

################## write your code  * begin * ###################

'''
    TestFileBottomLines = '''
################## write your code * end * ###################

gevent.wait()
'''
    CodeSnippets = [
        {
            'name': '创建 HTTP 客户端',
            'code': '''# 创建客户端
client = HttpClient()
'''
        },
        {
            'name': '使用代理',
            'code': '''client.proxy('127.0.0.1:8888')
'''
        },

        'separator',

        {
            'name': '发送 简单请求',
            'code': '''# 请求方法对应HTTP方法，包括:get、post、put、delete 等
response = client.send('POST', 
    'http://httpbin.org/uuid'
)
'''
        },

        {
            'name': '设置 url参数',
            'code': '''response = client.get(
    '/api/path1', 
    # 通过params传入url参数
    params={
        'param1':'value1',
        'param2':'value2'
    }
    )
'''
        },

        {
            'name': '设置 消息头',
            'code': '''response = client.get(
    '/api/path1',
    # 通过headers传入指定消息头
    headers={
        'header1':'value1',
        'header2':'value2'
    })
'''
        },

        {
            'name': '设置 消息体，urlencode 格式',
            'code': '''response = client.post(
    '/api/path1',
    # 通过data传入指定urlencode格式的消息体参数
    data={
        'param1':'value1',
        'param2':'value2'
    })
'''
        },

        {
            'name': '设置 消息体，json 格式',
            'code': '''response = client.post(
    '/api/path1',
    # 通过json传入指定json格式的消息体参数
    json={
        'param1':'value1',
        'param2':'value2'
    })
'''
        },

        {
            'name': '设置 消息体，直接写入 字节',
            'code': """response = client.post(
    '/api/path1',
    headers={
        'Content-Type':'application/xml'
    }
    # 下面填写bytes的内容，注意最后的编码格式
    data='''
    <?xml version="1.0" encoding="UTF-8"?>
    <CreateBucketConfiguration>
        <StorageClass>Standard</StorageClass>
    </CreateBucketConfiguration>
    '''.encode('utf8')
    )
"""
        },

        {
            'name': '循环发10个请求',
            'code': '''for i in range(10): 
    response = client.get('/api/path1')
    sleep(5) # 间隔5秒
'''
        },

        'separator',

        {
            'name': '查看 响应时长',
            'code': '''print(f"响应时长为 {response.responseTime} ms")
'''
        },

        {
            'name': '查看 响应状态码',
            'code': '''print(f"响应状态码为 {response.status_code} ") 
'''
        },

        {
            'name': '查看 消息体 文本内容',
            'code': '''print(f"消息体字符串为 {response.text()} ") 
'''
        },

        {
            'name': '查看 消息体 原始内容',
            'code': '''print(f"消息体字节串为 {response.raw} ") 
'''
        },

        {
            'name': '查看 消息体 json格式',
            'code': '''pprint(response.json())
'''
        },

        {
            'name': '查看 消息头',
            'code': '''# 获取消息头Content-Type值
ct = response.headers['Content-Type']    
print(f"消息头Content-Type值为 {ct} ") 
'''
        },

        {
            'name': '报告一个错误',
            'code': '''      
Stats.oneError()  # 报告一个错误，加入到统计信息中 
TestLogger.write('这里写详细信息到测试日志中，方便定位问题')        
'''
        },

        {
            'name': '测试日志添加信息',
            'code': '''TestLogger.write('这里写日志信息')
'''
        },

        'separator',

        {
            'name': '等待10秒',
            'code': '''sleep(10)
'''
        },
    ]


    def __init__(self):
        super().__init__()
